﻿
// version 0.1{Ana Ibáñez Constructor, métodos:Lanzar, DibujarEmentos,ComprobarEventos,ComprobarColisiones,MoverElementos,SePuedeMoverDerecha,SePuedeMoverIzquierda,
//PararHastaSiguienteFotograma}

// 21/03/2013 MªInés Antón Castelló y José Javier Amorós
//            Creado el objeto Menu y llama a la función de dibujarMenu.

using System;
using System.Collections.Generic;

namespace Monkey
{
    class Partida
    {

        private Escenario miEscenario;
        private bool partidaAcabada;
        private Personaje personaje;
        private Menu miMenu;
        private int coordXRaton;
        private int coordYRaton;
        private bool hayEvento;
        private bool hayOpcionSeleccionada;
        private Opcion opcionSeleccionada;
        private List<Escenario> escenarios;
        private string[] coordenadasPjEnEscenario = {
            "1176-230",
            "125-360"
        };
        private int mapaActual;
        private string elementoDebajoRaton;
        Font sans18;

        public Partida()
        {
            sans18 = new Font("data/Joystix.ttf", 18);
            mapaActual = 0;
            personaje = new Personaje();
            //se crean todos los mapas y se meten en una lista, para poder cambiar
            //mas facilmente
           /* escenarios.Add(new Escenario("data/escenarios/pueblo/pueblo1.txt"));
            escenarios.Add(new Escenario("data/escenarios/bar/bar.txt"));*/
            //una vez creados asignamos el primer mapa a miEscenario
            miEscenario = new Escenario("data/escenarios/pueblo/pueblo1.txt");
            miMenu = new Menu(this);
            partidaAcabada = false;
            hayOpcionSeleccionada = false;
            elementoDebajoRaton = "";
        }

        public void CambiarMapa()
        {
            miEscenario = escenarios[mapaActual];
            string[] coordenadas = coordenadasPjEnEscenario[mapaActual].Split();
            personaje.SetX(Convert.ToInt32(coordenadas[0]));
            personaje.SetY(Convert.ToInt32(coordenadas[1]));
        }

        public void Lanzar()
        {

            while (!partidaAcabada)
            {
                DibujarElementos();
                ComprobarEventos();
                if (hayEvento )
                {
                    EjecutarEventoRaton();
                }
                if (Hardware.KeyPressed(Hardware.KEY_ESC))
                {
                    partidaAcabada = true;
                    Hardware.ResetScroll();
                }
                ComprobarColisiones();
                HacerEscroll();
                PararHastaSiguienteFotograma();
            } // end of game loop
        }


        public void DibujarElementos()
        {
            Hardware.LimpiarPantalla();
            miEscenario.Dibujar();
            personaje.Dibujar();
            miEscenario.DibujarEncimaPersonaje ();
            miMenu.Dibujar(hayOpcionSeleccionada, opcionSeleccionada, elementoDebajoRaton);

            Hardware.ShowHiddenScreen();
        }


        public void ComprobarEventos()
        {

            int x = -1, y = -1;
            int boton = Hardware.ReadMouse(ref x, ref y);
            if (x != -1 && y != -1)
            {

                if (boton == Hardware.MOUSE_LEFT_BUTTON)
                {
                    coordXRaton = x + miEscenario.GetXInicial();
                    coordYRaton = y + miEscenario.GetYInicial();
                    hayEvento = true;
                }
            }
        }


        public bool SePuedeMoverDerecha(){
            return ((personaje.GetX() < miEscenario.GetAncho())
                    && (!miEscenario.ComprobarSiPuedeMoverse(
                    personaje.GetX() + personaje.GetVelocidad(), personaje.GetY(),
                    personaje.GetAlto(), personaje.GetAncho())));
                   
        }


        public bool SePuedeMoverIzquierda()
        {
            return ((personaje.GetX() > 0) && (!miEscenario.ComprobarSiPuedeMoverse(
                    personaje.GetX() - personaje.GetVelocidad(), personaje.GetY(),
                    personaje.GetAlto(), personaje.GetAncho())));
        }
        public bool SePuedeMoverAtras()
        {
            return ((personaje.GetY() > 0) && (!miEscenario.ComprobarSiPuedeMoverse
                    (personaje.GetX(), personaje.GetY() - personaje.GetVelocidad(),
                    personaje.GetAlto(), personaje.GetAncho())));
        }


        public bool SePuedeMoverAlante()
        {
            return ((personaje.GetY() < miEscenario.GetAlto()) && (!miEscenario.ComprobarSiPuedeMoverse(
                    personaje.GetX(), personaje.GetY() + personaje.GetVelocidad(),
                    personaje.GetAlto(), personaje.GetAncho())));
        }


        public void HacerEscroll()
        {
            if ((personaje.GetX() >= miEscenario.GetXInicial() + 600) && (personaje.GetX() <= (miEscenario.GetAncho() - 200)))
                {
                Hardware.ScrollHorizontally((short)-personaje.GetVelocidad());
                miEscenario.SetXInicial(personaje.GetVelocidad());
                }
            if (personaje.GetX() <= miEscenario.GetXInicial() + 200 && miEscenario.GetXInicial() != 0)
                {
                Hardware.ScrollHorizontally((short)personaje.GetVelocidad());
                miEscenario.SetXInicial(-personaje.GetVelocidad());
                }
            if (personaje.GetY() <= miEscenario.GetYInicial() + 200 && miEscenario.GetYInicial() != 0)
                {
                Hardware.ScrollVertically((short)personaje.GetVelocidad());
                miEscenario.SetYInicial(-personaje.GetVelocidad());
                }
            if ((personaje.GetY() >= miEscenario.GetYInicial() + 400)
                    && (personaje.GetY() <= miEscenario.GetAlto() - 200))
                {
                Hardware.ScrollVertically((short)-personaje.GetVelocidad());
                miEscenario.SetYInicial(personaje.GetVelocidad());
                }
        }


        public void ComprobarColisiones()
        {
            //TO DO
            //para comprobar si esta en las coordenadas en las
            //que debe cambiar de mapa.

            /*int nuevoMapa = miEscenario.ComprobarCambioMapa();
            if (nuevoMapa != mapaActual)
            {
             *  mapaActual = nuevoMapa;
                CambiarMapa();
            }*/
            elementoDebajoRaton = miEscenario.ComprobarSiHayElemento(coordXRaton, coordYRaton);
        }


        public void SeleccionarOpcion()
        {
           
            opcionSeleccionada = miMenu.ObtenerOpcionEnPosicion((short)(coordXRaton - miEscenario.GetXInicial()), (short)(coordYRaton - miEscenario.GetYInicial()));
            hayOpcionSeleccionada = true;
           
        }


        public void EjecutarEventoRaton()
        {
            if (coordXRaton < 120 * 3 && coordYRaton > 450)
            {
                
                SeleccionarOpcion();
            }
            else if(coordYRaton<450)
            {
                MoverElementos();
            }
        }

        public void MoverElementos()
        {
            if (hayOpcionSeleccionada)
            {
                miEscenario.EjecutarOpcion(opcionSeleccionada.GetTexto(), coordXRaton + miEscenario.GetXInicial(), coordYRaton + miEscenario.GetYInicial());
                hayOpcionSeleccionada = false;
            }
            else
            {
                personaje.MoverSe(coordXRaton, coordYRaton, SePuedeMoverDerecha(), SePuedeMoverIzquierda(), SePuedeMoverAtras(), SePuedeMoverAlante());
                if (personaje.GetEstaParado())
                {
                    hayEvento = false;
                    personaje.SetVelocidadX(4);
                    personaje.SetVelocidadY(4);
                }
            }
        }


       /* public bool GetHayOpcionSeleccionada()
        {
            return hayOpcionSeleccionada;    
        }


        public string GetOpcionSeleccionada()
        {
            return opcionSeleccionada.GetTexto();    
        }*/


        public static void PararHastaSiguienteFotograma()
        {
            Hardware.Pause(80);
        }
    }
}

